Input Object型 (graphql)
Mutation や Query の引数専用のオブジェクト型
例
code:graphql(js)
input CreateUserInput {
name: String!
age: Int
}
type Mutation {
createUser(input: CreateUserInput!): User
}
gpt-5.icon
1. Input Object型とObject型の違い
出力専用。クライアントに返すレスポンスを定義。
フィールドは必ずリゾルバを持ち、サーバーから計算・取得される。
入力に使えない(セキュリティや表現の一貫性のため)。
Input Object型
入力専用。クエリやミューテーションに渡す引数を定義。
ネストした複雑な構造を持てる。
フィールドはただの値で、リゾルバは持たない。
2. なぜ「別に存在している」のか?
もし出力用の Object 型をそのまま入力に使えると、以下の問題が出ます:
1. 曖昧さの回避
出力フィールドには「計算されるもの」や「読み取り専用の値」がある(例: id, createdAt)。
入力にそれを混ぜると「書き込み可能かどうか」が曖昧になる。
2. セキュリティ
出力に含まれる内部情報(例: データベースのIDやサーバー生成フィールド)をクライアントから勝手に渡されると危険。
入力専用型を分けることで、受け取れる値をサーバーが明示的に制御できる。
3. スキーマ設計の明確化
「クライアントが送れるもの」と「サーバーが返すもの」を区別できる。
フロントエンド/バックエンド間の契約が明確になる。
3. 実例
code:graphql(js)
# 出力用
type User {
id: ID!
name: String!
createdAt: String!
}
# 入力用
input CreateUserInput {
name: String!
}
もし User をそのまま input に使っていたら、クライアントは id や createdAt まで渡せてしまうけど、それは本来サーバー側が決めるべきもの。
→ input を分けることで、安全で意図通りのデータ流れになる。